package zisu.netty.practice.netty.protobuf.entity;


import com.google.protobuf.InvalidProtocolBufferException;

import java.util.Arrays;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2020/12/22 10:26
 */
public class TestProtobuf {
    /**
     * 序列化
     * */
    public static byte[] serializeObject2Bytes(){
        UserModuler.User.Builder userBuilder = UserModuler.User.newBuilder();
        userBuilder.setUserId("1001")
                .setUserAge(11)
                .setUserName("张三")
                .addFavorite("足球")
                .addFavorite("篮球");
        /**
         * 序列化机制：
         * 1. java序列化 比如一个int类型 （4字节长度）
         * //int a = 2  &  int b = 110000000
         * java的序列化无论 int类型数值大小实际占用几个字节，在内存中都是以4个长度（32位）
         *
         *  protobuf 序列化技术
         *  是按照实际的数据大小，动态伸缩的，因此很多时候 很多int数据并没有 占用4个字节，
         *  所以protobuf序列化后 一般都会比int 占用长度小很多
         * */
        UserModuler.User build = userBuilder.build();
        System.out.println(Arrays.toString(build.toByteArray()));
        return build.toByteArray();
    }

    /**
     * 反序列化
     * */
    public static UserModuler.User serializeBytes2Object(byte[] data) throws InvalidProtocolBufferException {
        return UserModuler.User.parseFrom(data);
    }
    public static void main(String[] args) throws InvalidProtocolBufferException {
        byte[] data = serializeObject2Bytes();
        UserModuler.User user = serializeBytes2Object(data);
        System.out.println(user.getUserId());
        System.out.println(user.getUserAge());
    }

}
